home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / mui / bcc_src.lha / Parser / CreateDisp.cpp < prev    next >
C/C++ Source or Header  |  1998-03-15  |  5KB  |  138 lines

  1. #include "ClassDef.h"
  2. #include "MethodDef.h"
  3.  
  4. #include "VarDef.h"
  5. #include "ParseBC.h"
  6. #include "Global.h"
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10.  
  11. void ParseBC::CreateDisp( FILE *fh )
  12. {
  13.  
  14.         fprintf( fh, "\n/* %s - %s class dispatcher */\n\n", cd->type, cd->Name );
  15.  
  16.         if( cd->sw & SW_SELFCREATE )
  17.             switch( *cd->type ) {
  18.                 case 'B':
  19.                     fprintf( fh, "struct IClass *cl_%s;\n", cd->Name);
  20.                     break;
  21.                 default:
  22.                     fprintf( fh, "struct MUI_CustomClass *cl_%s;\n", cd->Name);
  23.             }
  24.         
  25.         FScan( MethodDef, md1, cd ) {
  26.             if( !(md1->switches & (SW_VIRTUAL|SW_LOCAL)) ) fprintf( fh, "unsigned long m%s%s( struct IClass *cl, Object *obj, %s msg );\n", cd->Name, md1->Name, md1->msgtype );
  27.         }
  28.  
  29.         short Sc = 0, Gc = 0, Sg = 0, Ss = 0;
  30.         FScan( VarDef, vds, &(cd->Var) ) {
  31.             if( !(vds->switches & SW_VIRTUAL) ) {
  32.                 Sc |= vds->switches & SW_SET;
  33.                 Gc |= vds->switches & SW_GET;
  34.                 if( vds->switches & SW_SET ) Ss |= vds->switches & SW_SIMPLE;
  35.                 if( vds->switches & SW_GET ) Sg |= vds->switches & SW_SIMPLE;
  36.             }
  37.         }
  38.         
  39.         if( Sc ) {
  40.  
  41.             if( cd->FindItem( "OM_SET" ) ) {
  42.                 Error( 26 );
  43.                 return;
  44.             }
  45.  
  46.             MethodDef *md1;
  47.             md1 = new MethodDef( "OM_SET", 6, 0, 0 );
  48.             cd->AddTail( (Family*)md1 );
  49.         
  50.             fprintf( fh, "\nstatic unsigned long m%sOM_SET( struct IClass *cl, Object *obj, struct opSet *msg )\n{\n", cd->Name );
  51.             if( Ss ) fprintf( fh, " %sData *data = INST_DATA(cl, obj);\n", cd->Name );
  52.  
  53.             InsertIAttrPre( ofh, SW_SET );
  54.             InsertIAttr( ofh, SW_SET );
  55.             
  56.             fprintf( fh, "     return DoSuperMethodA( cl, obj, (Msg)msg );\n}\n" );
  57.         }
  58.         
  59.         if( Gc ) {
  60.  
  61.             if( cd->FindItem( "OM_GET" ) ) {
  62.                 Error( 26 );
  63.                 return;
  64.             }
  65.  
  66.             MethodDef *md2;
  67.             md2 = new MethodDef( "OM_GET", 6, 0, 0 );
  68.             cd->AddTail( (Family*)md2 );
  69.  
  70.             fprintf( fh, "\nstatic unsigned long m%sOM_GET( struct IClass *cl, Object *obj, struct opGet *msg )\n{\n", cd->Name );
  71.             if( Sg ) fprintf( fh, " %sData *data = INST_DATA(cl, obj);\n", cd->Name );
  72.             fprintf( fh, "    switch( msg->opg_AttrID ) {\n" );
  73.  
  74.             FScan( VarDef, vd, &(cd->Var) ) {
  75.                 if( (vd->switches & SW_GET) && !(vd->switches & SW_VIRTUAL) ) {
  76.                     fprintf( fh, "            case %s:", vd->FullName() );
  77.                     if( vd->switches & SW_SIMPLE ) fprintf( fh, " *msg->opg_Storage = (unsigned long)data->%s; break;\n", vd->Name );
  78.                     else fprintf( fh, " a%s%sGet( cl, obj, (void*)&msg->opg_AttrID%s ); break;\n", cd->Name, vd->Name, (vd->passmsg & SW_GET) ? ", msg" : "" );
  79.                 }
  80.             }
  81.  
  82.             fprintf( fh, "            default: return DoSuperMethodA( cl, obj, (Msg)msg );\n" );
  83.             fprintf( fh, "    }\n return 1;\n}\n" );
  84.  
  85.         }
  86.  
  87.         
  88.         fprintf( fh, "\nstatic unsigned long" );
  89.         if( !Prefs.nosaveds ) fprintf( fh, " SAVEDS" );
  90.         fprintf( fh, " ASM %s_Dispatcher( REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg )\n{\n", cd->Name );
  91.         fprintf( fh, "    switch( msg->MethodID ) {\n" );
  92.         
  93.         FScan( MethodDef, md, cd ) {
  94.  
  95.             if( !(md->switches & SW_VIRTUAL) ) 
  96.                 fprintf( fh, "        case %s: return m%s%s( cl, obj, (%s)msg );\n", md->FullName(), cd->Name, md->Name, md->msgtype );
  97.         
  98.         }
  99.         
  100.         fprintf( fh, "    }\n    return( DoSuperMethodA( cl, obj, msg ) );\n}\n\n" );
  101.         
  102.         if( cd->sw & SW_SELFCREATE ) fprintf( fh, "static " );
  103.         switch( *cd->type ) {
  104.             case 'B':
  105.                 fprintf( fh, "struct IClass *%s_Create( void )\n{\nstruct IClass *cl;\n", cd->Name );
  106.                 if( cd->superpriv ) fprintf( fh, "    if( cl = MakeClass( NULL, NULL, cl_%s, sizeof( %sData ), 0 ) ) {\n", cd->PSuper, cd->Name );
  107.                 else fprintf( fh, "    if( cl = MakeClass( NULL, %s, NULL, sizeof( %sData ), 0 ) ) {\n", cd->PSuper, cd->Name );
  108.                 fprintf( fh, "        cl->cl_Dispatcher.h_Entry = (ULONG (*)())%s_Dispatcher;\n        cl->cl_Dispatcher.h_SubEntry = NULL;\n", cd->Name );
  109.                 fprintf( fh, "        return cl;\n    }\n    return 0;\n}\n" );
  110.                 break;
  111.         
  112.             default:
  113.                 fprintf( fh, "struct MUI_CustomClass *%s_Create( void )\n{\n", cd->Name );
  114.                 if( cd->superpriv ) fprintf( fh, "    return MUI_CreateCustomClass( NULL, NULL, cl_%s, sizeof( %sData ), %s_Dispatcher );\n", cd->PSuper, cd->Name, cd->Name, cd->Name );
  115.                 else fprintf( fh, "    return MUI_CreateCustomClass( NULL, %s, NULL, sizeof( %sData ), %s_Dispatcher );\n", cd->PSuper, cd->Name, cd->Name, cd->Name );
  116.                 fprintf( fh, "}\n" );
  117.         }
  118.         
  119.         if( cd->sw & SW_SELFCREATE ) {
  120.         
  121.             fprintf( fh, "Object *%s_New( unsigned long pad, unsigned long tags, ... )\n{\n", cd->Name );
  122.             fprintf( fh, " if( !cl_%s ) cl_%s = %s_Create();\n", cd->Name, cd->Name, cd->Name );
  123.             switch( *cd->type ) {
  124.                 case 'B':
  125.                     fprintf( fh, " return NewObjectA( cl_%s, NULL, (struct TagItem*)tags );\n", cd->Name );
  126.                     break;
  127.         
  128.                 default:
  129.                     fprintf( fh, " return NewObjectA( cl_%s->mcc_Class, NULL, (struct TagItem*)tags );\n", cd->Name );
  130.             }
  131.  
  132.             fprintf( fh, "}\n" );
  133.             
  134.         }
  135.         
  136. }
  137.  
  138.